package com.ys.多线程.p3线程同步;

/**
 * 描述: 铁路公司来控制长江大桥的过车计划
 * 步骤：
 *  * 1 创建共享资源对象ChangJiangBridge对象
 *  * 2 创建动车和货车
 *  * 3 创建线程，将动车和货车注入到线程中
 *  * 4 启动线程
 *  * 运行结果如下：
 * 当前进入时间:1609846681088Thread-0动车正在通过长江大桥,大约需要5秒
 * 当前进入时间:1609846681088Thread-1货车正在通过长江大桥,大约需要3秒
 * 货车成功通过
 * 动车成功通过
 *  * 问题：同一毫秒动车和货车同时通过大桥，会翻车
 *  如果没有加锁,多线程下可以同时访问长江大桥这个共享资源,那么会撞车
 *
 *  方法上加锁后
 *  当前进入时间:1609846755915Thread-0动车正在通过长江大桥,大约需要5秒
 * 动车成功通过
 * 当前进入时间:1609846760931Thread-1货车正在通过长江大桥,大约需要3秒
 * 货车成功通过
 *一:
 * synchronize -- 加锁,
 *  可以修饰方法  - 静态与成员
 *  可以修饰代码块 - synchronized(this){}
 *  可以修饰当前对象的某一个属性,--必须是引用类型
 *  看到这个是一个this,this本质是一个引用指针,所以是一个引用类型地址值
 *  所以可以去锁自定义的类,以及各种包装类修饰的变量
 *  注意:
 *  如果锁是当前对象的一个属性，最好使用final修饰，让其不可变
 *  使用 synchronized 加锁的原则：让你的锁足够的轻、小
 *  二:
 *    使用 synchronized 修饰的 同步代码块,或者 方法, 当进入该线程"内容执行时" 其他线程就会被 MONTIOR == 监控,管程,管住
 *  三:
 *  同步方法对应的字节码指令如下：
 *
 *  ACC_SYNCHRONIZED 同步方法对应的字节码指令
 *  monitorenter、monitorexit 同步块对应的字节码指令
 * @author CodeYang
 * @version 2021/1/5 19:32
 */
public class RailwayCorporationTest {

    public static void main(String[] args) {
        // 创建长江大桥共享资源
        ChangJiangBride bride = new ChangJiangBride();

        // 创建线程任务
        DongCheTask dongCheTask = new DongCheTask(bride);
        HuoCheTask huoCheTask = new HuoCheTask(bride);
        // 创建线程
        Thread t1 = new Thread(dongCheTask);
        Thread t2 = new Thread(huoCheTask);

        t1.start();
        t2.start();




    }
}
